﻿Imports Microsoft.VisualBasic
Imports ADOEntity

Public Class clsEdmUser
    Dim key As String = "Encrytion By Fusionsoft Solution"
    Dim userEdmx As ADOEntity.UserEntities
    Dim config As systemConfigEntities = New systemConfigEntities
    Dim statusIsPwdExpire As String = 0 ' 1 หมดอายุ / 0 ยังไม่หมดอายุ
    Dim statusMustChangePWD As String = 0

#Region " property "
    Private blnChkBeginDate As Boolean
    Private blnChkMustChangePwd As Boolean
    Private blnIsPwdExpire As Boolean
    Private blnIsUserExpire As Boolean
    Private blnIsPwdLock As Boolean
    Private blnIsInactive As Boolean
    Private strLastComName As String
    Private strLastIP As String
    Private strMsg As String
    Private strErrExp As String
    Private blnStatusErrOrMsg As Boolean
    Private blnCurrentLockNum As Boolean

    Private Enum chkDatePwd
        PwdBeforeExpDate = 1
        PwdEqualExpDate = 2
        PwdAfterExpDate = 3
    End Enum

    Public Property chkBeginDate() As Boolean
        Get
            Return blnChkBeginDate
        End Get
        Set(ByVal value As Boolean)
            blnChkBeginDate = value
        End Set
    End Property

    Public Property chkMustChangePwd() As Boolean
        Get
            Return blnChkMustChangePwd
        End Get
        Set(ByVal value As Boolean)
            blnChkMustChangePwd = value
        End Set
    End Property

    Public Property chkIsPwdExpire() As Boolean
        Get
            Return blnIsPwdExpire
        End Get
        Set(ByVal value As Boolean)
            blnIsPwdExpire = value
        End Set
    End Property

    Public Property chkIsPwdLock() As Boolean
        Get
            Return blnChkMustChangePwd
        End Get
        Set(ByVal value As Boolean)
            blnChkMustChangePwd = value
        End Set
    End Property

    Public Property chkIsUserExpire() As Boolean
        Get
            Return blnChkMustChangePwd
        End Get
        Set(ByVal value As Boolean)
            blnChkMustChangePwd = value
        End Set
    End Property

    Public Property chkIsInactive() As Boolean
        Get
            Return blnChkMustChangePwd
        End Get
        Set(ByVal value As Boolean)
            blnChkMustChangePwd = value
        End Set
    End Property

    Public Property chkCurrentLockNum() As Boolean
        Get
            Return blnCurrentLockNum
        End Get
        Set(ByVal value As Boolean)
            blnCurrentLockNum = value
        End Set
    End Property

    Public WriteOnly Property LastComName() As String
        Set(ByVal value As String)
            strLastComName = value
        End Set
    End Property

    Public WriteOnly Property LastIP() As String
        Set(ByVal value As String)
            strLastIP = value
        End Set
    End Property

    Public ReadOnly Property Msg() As String
        Get
            Return strMsg
        End Get
    End Property

    Public ReadOnly Property ErrExp() As String
        Get
            Return strErrExp
        End Get
    End Property

#End Region

    Public Sub New()
        blnChkBeginDate = False
        blnChkMustChangePwd = False
        blnIsPwdExpire = False
        blnIsUserExpire = False
        blnIsPwdLock = False
        blnIsInactive = False
        strLastComName = ""
        strLastIP = ""
        strMsg = ""
        strErrExp = ""
        blnStatusErrOrMsg = False

    End Sub

    Public Function checkUser(ByVal uName As String, ByVal strPwd As String, ByVal strLastIP As String, ByVal strLastComName As String) As clsSessionMenuRight
        'ตรวจสอบการล็อคอินก่อนเข้าสูระบบ/ตรวจสอบยูสเซอร์ก่อนเปลี่ยนรหัส
        Dim clsMenuRight As New clsSessionMenuRight
        Dim clsDataTable As New clsLINQToDataTable
        Dim clsDateFormat As New clsDateFormat
        userEdmx = New UserEntities

        Try
            'query เพื่อเช็ค ว่า user ที่ login นี้มีในระบบหรือเปล่า-----------------------------------------------------------------------
          
            'Dim userQuery = (From userQ In userEdmx.SUSER Group Join tblBranch In userEdmx.SBRANCH _
            '                                                On userQ.BRANCHCODE Equals tblBranch.BRANCHCODE Into leftJoin = Group
            '                    From tblLeftBranch In leftJoin.DefaultIfEmpty
            '             Where userQ.USERNAME = uName _
            '             Select userQ.USERNAME, userQ.PASSWORD, userQ.EMPNAME, userQ.EMPLASTNAME, userQ.USERRIGHT, userQ.BRANCHCODE, _
            '                     tblLeftBranch.BRANCHNAME, tblLeftBranch.SOL_ID, userQ.PWDBEGINDATE, userQ.ZONECODE, userQ.ALLCODERIGHT, _
            '                     userQ.PWDEXPIREDATE, userQ.ISPWDEXPIRE, userQ.MUSTCHANGEPWD, userQ.CURRENTLOCKNUM, _
            '                     userQ.USEREXPIREDATE, userQ.ISUSEREXPIRE, _
            '                     userQ.ISPWDLOCK, userQ.ISINACTIVE, userQ.DEPTCODE, userQ.ROLECODE, userQ.ISLOGIN).ToList
            Dim userQuery = (From userQ In userEdmx.SUSER Group Join tblBranch In userEdmx.SBRANCH _
                                                            On userQ.BRANCHCODE Equals tblBranch.BRANCHCODE Into leftJoin = Group
                                From tblLeftBranch In leftJoin.DefaultIfEmpty
                         Where userQ.USERNAME = uName _
                         Select userQ.USERNAME, userQ.PASSWORD, userQ.EMPNAME, userQ.EMPLASTNAME, userQ.USERRIGHT, userQ.BRANCHCODE, _
                                 tblLeftBranch.BRANCHNAME, userQ.PWDBEGINDATE, userQ.ZONECODE, userQ.ALLCODERIGHT, _
                                 userQ.PWDEXPIREDATE, userQ.ISPWDEXPIRE, userQ.MUSTCHANGEPWD, userQ.CURRENTLOCKNUM, _
                                 userQ.USEREXPIREDATE, userQ.ISUSEREXPIRE, _
                                 userQ.ISPWDLOCK, userQ.ISINACTIVE, userQ.DEPTCODE, userQ.ROLECODE, userQ.ISLOGIN).ToList




            '--------------------------------------------------------------------------------------------------------------
            If Not (userQuery.Count = 0) Then
                'If (userQuery(0).ROLECODE >= "90") Then
                '    If (ComparePassAdmin(strPwd)) Then
                '        'updateUser.ISPWDLOCK = 0
                '        'updateUser.PWDLOCKDATE = Nothing
                '        'updateUser.CURRENTLOCKNUM = 0
                '        ''updateUser.PASSWORD = defaultPWD
                '        ''updateUser.MUSTCHANGEPWD = 1
                '        'If updateUser.ROLECODE < 50 Then
                '        '    updateUser.PWDEXPIREDATE = Date.Now.AddDays(expirePWDUser).ToShortDateString
                '        'Else
                '        '    updateUser.PWDEXPIREDATE = Date.Now.AddDays(expirePWDAdmin).ToShortDateString
                '        'End If
                '        'updateUser.UPDATEBY = clsSessionMenuRight.getUserName
                '        'updateUser.UPDATEDATE = Now.ToShortDateString

                '        clsMenuRight.getUserName = userQuery(0).USERNAME
                '        clsMenuRight.getUserRight = userQuery(0).USERRIGHT
                '        If Not (userQuery(0).BRANCHCODE Is Nothing) Then
                '            clsMenuRight.getBranchCode = userQuery(0).BRANCHCODE
                '            clsMenuRight.getBranchName = userQuery(0).BRANCHNAME
                '            clsMenuRight.getBranchCodeUse = userQuery(0).BRANCHCODE.Substring(0, 3)
                '        End If
                '        clsMenuRight.getDeptCode = userQuery(0).DEPTCODE
                '        clsMenuRight.getRoleGroup = userQuery(0).ROLECODE
                '        clsMenuRight.getEmpFirstName = userQuery(0).EMPNAME
                '        clsMenuRight.getEmpLastName = userQuery(0).EMPLASTNAME
                '        clsMenuRight.getZoneCode = userQuery(0).ZONECODE
                '        clsMenuRight.getAllCodeRight = userQuery(0).ALLCODERIGHT
                '        clsMenuRight.getDateTimeLogin = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.Th, dteDateIsChk:=Date.Now) & " " & Date.Now.ToShortTimeString

                '        Dim qryMenuRight = (From menuright In userEdmx.SMENURIGHT Where menuright.USERRIGHT = clsMenuRight.getUserRight).ToList

                '        clsMenuRight.getDsMenuRight.Tables.Add(clsDataTable.LINQToDataTable(qryMenuRight, "sMenuRight").Copy)
                '        clsMenuRight.getIsPwdExpire = statusIsPwdExpire
                '        clsMenuRight.getMustChangePwd = 1
                '        ChangeIsLogin(uName)
                '        ClearCurrentLockAndAddIpLogin(uName, strLastIP, strLastComName)

                '    End If



                'End If

                If checkPasswordLogin(userQuery(0).PASSWORD, strPwd) Then ' บรรทัดนี้เป็นการตรวจสอบ password ที่ login เข้ามาถูกต้องไหม 
                    'กรณีที่ login ถูกต้องก็จะทำการเช็คเงื่อนไขอื่นต่อไปโดยมี                   
                    '   - เช็คว่ามี ชื่อผู้ใช้งานนี้ได้มีการ active หรือไม่ 
                    '   - เช็คว่าวันที่ login กับ วันที่ใช้งานเริ่มต้น                   1
                    '   - เช็คว่า ชื่อผู้ใช้งาน ที่ใช้อยู่หมดอายุหรือยัง       
                    '   - เช็คว่า รหัสผ่านที่ใช้งานอยู่หมดอายุหรือไม่ 
                    '   - เช็คว่าได้มีการ login ผิดเกิน จำนวนครั้งหรือเปล่า
                    '   - เช็คว่าได้มีการเปลี่ยน password ในการเข้าใช้งานครั้งแรกหรือยัง     
                    Dim blnIsLogin As Boolean = False
                    'If (userQuery(0).ISLOGIN Is Nothing) Then
                    '    blnIsLogin = False
                    'Else
                    '    blnIsLogin = userQuery(0).ISLOGIN
                    'End If

                    If checkConditionLogin(uName, userQuery(0).PWDBEGINDATE, _
                                           userQuery(0).MUSTCHANGEPWD, _
                                           userQuery(0).PWDEXPIREDATE, userQuery(0).ISPWDEXPIRE, _
                                           userQuery(0).ISUSEREXPIRE, userQuery(0).USEREXPIREDATE, userQuery(0).ISINACTIVE, blnIsLogin, userQuery(0).CURRENTLOCKNUM, userQuery(0).USERRIGHT) Then
                        clsMenuRight.getUserName = userQuery(0).USERNAME
                        clsMenuRight.getUserRight = userQuery(0).USERRIGHT
                        If Not (userQuery(0).BRANCHCODE Is Nothing) Then
                            clsMenuRight.getBranchCode = userQuery(0).BRANCHCODE
                            clsMenuRight.getBranchName = userQuery(0).BRANCHNAME
                            clsMenuRight.getBranchCodeUse = userQuery(0).BRANCHCODE.Substring(0, 3)
                            'clsMenuRight.getSOL_ID = userQuery(0).SOL_ID
                        End If
                        clsMenuRight.getDeptCode = userQuery(0).DEPTCODE
                        clsMenuRight.getRoleGroup = userQuery(0).ROLECODE
                        clsMenuRight.getEmpFirstName = userQuery(0).EMPNAME
                        clsMenuRight.getEmpLastName = userQuery(0).EMPLASTNAME
                        clsMenuRight.getZoneCode = userQuery(0).ZONECODE
                        clsMenuRight.getAllCodeRight = userQuery(0).ALLCODERIGHT
                        clsMenuRight.getDateTimeLogin = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.Th, dteDateIsChk:=Date.Now) & " " & Date.Now.ToShortTimeString

                        Dim qryMenuRight = (From menuright In userEdmx.SMENURIGHT Where menuright.USERRIGHT = clsMenuRight.getUserRight).ToList

                        clsMenuRight.getDsMenuRight.Tables.Add(clsDataTable.LINQToDataTable(qryMenuRight, "sMenuRight").Copy)
                        clsMenuRight.getIsPwdExpire = statusIsPwdExpire
                        clsMenuRight.getMustChangePwd = statusMustChangePWD
                        ChangeIsLogin(uName)
                        ClearCurrentLockAndAddIpLogin(uName, strLastIP, strLastComName)
                    End If
                Else
                    'กรณีที่ login ผิดจะทำการ count CurrentLockNum
                    strMsg = "ชื่อผู้ใช้งาน หรือ รหัสผู้ใช้งาน ผิดกรุณา ล๊อกอินใหม่"
                    CountCurrentLockNum(uName)
                    clsMenuRight.getUserName = ""
                    clsMenuRight.getUserRight = ""
                    clsMenuRight.getDsMenuRight = Nothing

                End If
            Else



                strMsg = "ชื่อผู้ใช้งาน หรือ รหัสผู้ใช้งาน ผิดกรุณา ล๊อกอินใหม่"
                'CountCurrentLockNum(uName)
                clsMenuRight.getUserName = ""
                clsMenuRight.getUserRight = ""
                clsMenuRight.getDsMenuRight = Nothing
            End If



            userQuery.Clear()
            userQuery = Nothing
        Catch ex As Data.DataException
            strErrExp = ex.Message & " " & ex.InnerException.Message
            ' Throw ex
        Catch ex As Exception
            strErrExp = ex.Message & " " & ex.InnerException.Message
            ' Throw ex
        End Try
        userEdmx = Nothing
        clsDataTable = Nothing
        Return clsMenuRight
    End Function

    Private Function checkConditionLogin(ByVal strUserName As String, _
                                         ByVal beginDate As Date, _
                                         ByVal MustChangePwd As Boolean,
                                         ByVal PwdExpDate As Date,
                                         ByVal isPwdExp As Integer,
                                         ByVal isUserExp As Integer,
                                         ByVal UserExpDate As Date,
                                         ByVal IsInactive As Integer,
                                         ByVal isLogin As Boolean,
                                         ByVal LockNum As Integer,
                                         ByVal UserRight As String) As Boolean 'ตรวจสอบเงื่อนไขล็อคอิน
        Dim chkPassCondition As Boolean = False
        'Dim dateDif As Integer
        Try
            Dim dteDateBegin As Date = beginDate

            '------------------------------------------------
            'user นี้ได้มีการ ative หรือยัง
            '------------------------------------------------
            If Not (IsInactive = 1) Then
                chkPassCondition = True
                'Return chkPassCondition
            Else
                chkPassCondition = False
                strMsg = " ชื่อผู้ใช้งานคนนี้ยังไม่ได้เปิดใช้งาน "
                Return chkPassCondition
            End If
            '------------------------------------------------

            '------------------------------------------------
            'กลุ่มสิทธิ์ถูกระงับ หรือไม่
            '------------------------------------------------
            If (chkUserRightStatus(UserRight)) Then
                chkPassCondition = True
            Else
                chkPassCondition = False
                strMsg = " กลุ่มสิทธิ์ถูกระงับ กรุณาติดต่อผู้ดูแลระบบ "
                Return chkPassCondition
            End If
            '------------------------------------------------


            '------------------------------------------------
            'เช็คเรื่องของ วันเริ่มใช้งาน pass
            '------------------------------------------------
            If Not difDate(dteDateBegin, Date.Now) < 0 Then
                blnChkBeginDate = False
                chkPassCondition = True
            Else
                blnChkBeginDate = True
                chkPassCondition = False
                strMsg = "ชื่อผู้ใช้งาน นี้ยังไม่สามารถใช้งานได้"
                Return chkPassCondition
            End If
            '------------------------------------------------


            '------------------------------------------------
            'เช็คว่าชื่อผู้ใช้งานหมดอายุการใช้งานไปหรือยัง หมดแล้วให้แจ้งเตือน
            '------------------------------------------------
            If (isUserExp = 1) Then
                chkPassCondition = False
                strMsg = " ชื่อผู้ใช้งาน ที่ใช้งานหมดอายุกรุณาติดต่อ ผู้ดูแลระบบ "
                Return chkPassCondition
            Else
                If (chkUserExpDate(strUserName)) Then
                    chkPassCondition = True

                Else
                    chkPassCondition = False
                    Return chkPassCondition
                End If
            End If
            '------------------------------------------------


            '------------------------------------------------
            'เช็คว่า Pwd ที่ใช้งานอยู่หมดอายุไปหรือยัง ถ้าหมดแล้วให้แจ้ง user ให้เปลี่ยนโดยถ้าไม่เปลี่ยนก็จะไม่ให้ไปหน้าอื่น
            '------------------------------------------------
            'If (isPwdExp = 1) Then
            '    chkPassCondition = True
            '    strMsg = " รหัสผ่าน ที่ใช้งานหมดอายุกรุณาเปลี่ยนรหัสผ่านใหม่ "
            '    statusIsPwdExpire = 1
            '    chkPassCondition = True
            'Else
            Dim chkPwdStatus As chkDatePwd


            If (chkPwdExpDate(strUserName, chkPwdStatus)) Then
                chkPassCondition = True

            Else
                If (chkPwdStatus = chkDatePwd.PwdEqualExpDate) Then
                    statusIsPwdExpire = 1
                    chkPassCondition = True
                ElseIf (chkPwdStatus = chkDatePwd.PwdAfterExpDate) Then
                    blnIsPwdExpire = True
                    chkPassCondition = False
                    Return chkPassCondition
                End If
            End If

            'End If
            '------------------------------------------------


            '------------------------------------------------
            'เช็ค user นี้มีการ login เข้าใช้งานหรือยัง
            '------------------------------------------------
            If (isLogin = False) Then

                chkPassCondition = True
                'Return chkPassCondition
            Else

                'blnChkMustChangePwd = MustChangePwd
                chkPassCondition = False
                strMsg = "ชื่อผู้ใช้งานนี้ ได้มีการเข้าใช้งานอยู่"
                Return chkPassCondition
            End If
            '------------------------------------------------

            '------------------------------------------------
            'เช็คว่ามีการเปลี่ยน password ในการเข้าใช้งานครั้งแรก pass
            '------------------------------------------------
            If chkLocknum(LockNum, strUserName) = False Then
                chkPassCondition = False
                strMsg = " ล๊อกอิน เกินที่กำหนดไว้ กรุณาติดต่อ ผู้ดูแลระบบ เพื่อปลดล๊อก"
                Return chkPassCondition
            Else
                chkPassCondition = True
            End If
            '------------------------------------------------

            '------------------------------------------------
            'เช็คว่ามีการเปลี่ยน password ในการเข้าใช้งานครั้งแรก pass
            '------------------------------------------------
            If (MustChangePwd = False) Then

                blnChkMustChangePwd = MustChangePwd
                chkPassCondition = True
                'Return chkPassCondition
            Else

                blnChkMustChangePwd = MustChangePwd
                chkPassCondition = True
                strMsg = "กรุณาเปลี่ยนรหัสผ่านเข้าใช้งาน"
                statusMustChangePWD = 1
                Return chkPassCondition
            End If
            '------------------------------------------------








        Catch ex As Exception

            Throw ex
        End Try



        checkConditionLogin = True
        Return checkConditionLogin
    End Function
    ' function ที่ต้องเช็ค

    ' IsUserExpire --> เช็คว่า user ที่ใช้งานอยู่หมดอายุไปหรือยัง ถ้าหมดแล้วให้แจ้งเตือน ติดต่อ ผู้ดูแลระบบ
    ' userexpireDate -->  เช็คว่า จะหมดอายุเมื่อไหร่
    ' IsPwdLock --> เช็คว่า pwd ได้มีการถูกล๊อกหรือไม่
    ' IsInactive --> user นี้ได้มีการ ative หรือยัง


    'Dim dateDif As Integer = DateDiff(DateInterval.Day, datePwdExpire, Now.Date)
    'Dim strMsg As String = ""

    'If dateDif < 0 Then 'ถ้า pwd หมดอายุ
    '    strMsg = "รหัสผ่านหมดอายุ กรุณาเปลี่ยนรหัสผ่านใหม่"
    'ElseIf intIsLock = 0 Then
    '    strMsg = "ไม่สามารถใช้งานได้ เนื่องจากกถูกระงับเข้าใช้งาน"
    'ElseIf intIsInactive = 0 Then
    '    strMsg = "ไม่สามารถเข้าใช้งานได้ เนื่องจากถูกยกเลิกแล้ว"
    'Else
    '    strMsg = ""
    'End If
#Region " function work "

    Private Function chkUserRightStatus(ByVal strUserRight As String) As Boolean
        Dim blnPass As Boolean = True
        Dim qryUserRight = (From tblUserRight In userEdmx.SUSERRIGHT Where tblUserRight.USERRIGHT = strUserRight).ToList
        If (qryUserRight(0).STATUS = 1) Then
            blnPass = True
        Else
            blnPass = False
        End If

        Return blnPass
    End Function


    Private Function difDate(ByVal beginDate As Date, ByVal endDate As Date) As Integer
        ' Dim blnChkDate As Boolean = False
        Dim dateDif As Integer
        Try
            dateDif = DateDiff(DateInterval.Day, Convert.ToDateTime(beginDate.ToShortDateString), Convert.ToDateTime(endDate.ToShortDateString))
        Catch ex As Exception
            Throw ex
        End Try

        Return dateDif
    End Function

    Private Sub CountCurrentLockNum(ByVal strUserName As String)

        '------------------------------------------------
        'เช็คว่า pwd ได้มีการถูกล๊อกหรือไม่
        '------------------------------------------------
        userEdmx = New UserEntities
        Try
            Dim qryCurrentLockNum = (From countLockNum In userEdmx.SUSER Where countLockNum.USERNAME = strUserName).ToList
            If (qryCurrentLockNum(0).ISPWDLOCK = False) Then
                Dim qrySystem = (From systemConfig In config.SSYSTEMCONFIG Where systemConfig.CONFIGCODE.Contains("C02") _
                             Select systemConfig.CONFIGNUM).ToList

                If Not (qryCurrentLockNum(0).CURRENTLOCKNUM Is Nothing) Then
                    If (qryCurrentLockNum(0).CURRENTLOCKNUM < qrySystem(0)) Then
                        qryCurrentLockNum(0).CURRENTLOCKNUM = qryCurrentLockNum(0).CURRENTLOCKNUM + 1

                        If (qryCurrentLockNum(0).CURRENTLOCKNUM = qrySystem(0)) Then
                            qryCurrentLockNum(0).ISPWDLOCK = 1
                            qryCurrentLockNum(0).PWDLOCKDATE = setFormatDate()
                            strMsg = " ล๊อกอิน เกินที่กำหนดไว้ กรุณาติดต่อ ผู้ดูแลระบบ เพื่อปลดล๊อก"
                        End If

                    Else
                        qryCurrentLockNum(0).ISPWDLOCK = 1
                        qryCurrentLockNum(0).PWDLOCKDATE = setFormatDate()
                        strMsg = " ล๊อกอิน เกินที่กำหนดไว้ กรุณาติดต่อ ผู้ดูแลระบบ เพื่อปลดล๊อก"
                    End If

                Else
                    qryCurrentLockNum(0).CURRENTLOCKNUM = 1

                End If
                userEdmx.SaveChanges()
                qryCurrentLockNum.Clear()
                qrySystem.Clear()
                qrySystem = Nothing
                userEdmx = Nothing
                qryCurrentLockNum = Nothing
            Else
                strMsg = " ล๊อกอิน เกินที่กำหนดไว้ กรุณาติดต่อ ผู้ดูแลระบบ เพื่อปลดล๊อก"
            End If
        Catch ex As Exception
            strErrExp = "เกินข้อผิดพลาดใน ระบบล๊อกอิน ติดต่อผู้ดูแลระบบ"
            Throw ex
        End Try


        '------------------------------------------------
    End Sub

    Private Sub ChangeIsLogin(ByVal strUserName As String)
        userEdmx = New UserEntities
        Try
            Dim qryIsLogin = (From TblUser In userEdmx.SUSER Where TblUser.USERNAME = strUserName).ToList
            qryIsLogin(0).ISLOGIN = True
            userEdmx.SaveChanges()

            qryIsLogin.Clear()
            qryIsLogin = Nothing
            userEdmx = Nothing
        Catch ex As Exception
            strErrExp = "เกินข้อผิดพลาดใน ระบบล๊อกอิน ติดต่อผู้ดูแลระบบ"
            Throw ex
        End Try
    End Sub

    Private Sub ClearCurrentLockAndAddIpLogin(ByVal strUserName As String, ByVal strIp As String, ByVal strComName As String)
        userEdmx = New UserEntities
        Dim clsDateFormat As New clsDateFormat
        Try
            Dim qryCurrentLockNum = (From countLockNum In userEdmx.SUSER Where countLockNum.USERNAME = strUserName).ToList
            qryCurrentLockNum(0).CURRENTLOCKNUM = 0
            qryCurrentLockNum(0).LASTCOMNAME = strComName
            qryCurrentLockNum(0).LASTIP = strIp
            qryCurrentLockNum(0).LASTLOGINDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, dteDateIsChk:=Date.Now)

            userEdmx.SaveChanges()

            qryCurrentLockNum.Clear()
            qryCurrentLockNum = Nothing
            userEdmx = Nothing
        Catch ex As Exception
            strErrExp = "เกินข้อผิดพลาดใน ระบบล๊อกอิน ติดต่อผู้ดูแลระบบ"
            Throw ex
        End Try



    End Sub

    Public Function checkPasswordLogin(ByVal strPassDB As String, ByVal strPwdLogin As String) As Boolean
        Dim chkPass As Boolean = False
        Dim clschkPassword As New Crypto

        Dim alg As Crypto.Algorithm = Crypto.Algorithm.Rijndael
        Crypto.EncryptionAlgorithm = alg
        Crypto.Key = key
        Crypto.Encoding = Crypto.EncodingType.BASE_64
        Crypto.Content = strPassDB
        chkPass = Crypto.DecryptString()
        If (Crypto.Content = strPwdLogin) Then
            chkPass = True
        Else
            chkPass = False
        End If
        clschkPassword = Nothing

        Return chkPass
    End Function

    Public Function converPassLoginToDB(ByVal strPass As String) As String
        Dim strPassDescry As String
        Dim clschkPassword As New Crypto

        Dim alg As Crypto.Algorithm = Crypto.Algorithm.Rijndael


        Crypto.EncryptionAlgorithm = alg
        Crypto.Key = key
        Crypto.Encoding = Crypto.EncodingType.BASE_64
        Crypto.Content = strPass

        If Not (Crypto.EncryptString(strPass)) Then
            strErrExp = Crypto.CryptoException.Message
        Else

        End If
        strPassDescry = Crypto.Content
        clschkPassword = Nothing

        Return strPassDescry
    End Function

    Public Function DecryPass(ByVal strPass As String) As String
        Dim strPassDescry As String
        Dim clschkPassword As New Crypto

        Dim alg As Crypto.Algorithm = Crypto.Algorithm.Rijndael
        Crypto.EncryptionAlgorithm = alg
        Crypto.Key = key
        Crypto.Encoding = Crypto.EncodingType.BASE_64
        Crypto.Content = strPass

        If Not (Crypto.DecryptString()) Then
            strErrExp = Crypto.CryptoException.Message
        Else

        End If
        strPassDescry = Crypto.Content
        clschkPassword = Nothing

        Return strPassDescry
    End Function

    Private Function chkPwdExpDate(ByVal strUserName As String, Optional ByRef pwdStats As chkDatePwd = 1) As Boolean
        Dim blnStatus As Boolean
        userEdmx = New UserEntities

        Try
            Dim intDay As Int16 = 0
            Dim qryPwdExpDate = (From user In userEdmx.SUSER Where user.USERNAME = strUserName
                                Select user.PWDEXPIREDATE, user.ISPWDEXPIRE).ToList

            Dim qrySystem = (From systemConfig In config.SSYSTEMCONFIG _
                             Where systemConfig.CONFIGCODE.Contains("C04") _
                             Select systemConfig.CONFIGNUM).ToList
            intDay = difDate(Date.Now.ToShortDateString, qryPwdExpDate(0).PWDEXPIREDATE)

            If (intDay = 0) Then
                'ให้ทำการแก้ไขสถานะ isPwdexpire = 1 แล้วก็
                'แจ้ง msg ว่าเงื้อนไขหมดอายุแจ้ง admin
                pwdStats = 2
                strMsg = "เนื่องจากรหัสผ่านหมดอายุในวันที่ " + qryPwdExpDate(0).PWDEXPIREDATE + " กรุณาเปลี่ยนรหัสผ่านใหม่"
                blnStatus = False
               
            ElseIf (intDay < 0) Then
                pwdStats = 3
                Dim ModifyIsPwdExpire = (From tbModifyUser In userEdmx.SUSER _
                                                Where tbModifyUser.USERNAME = strUserName _
                                                ).ToList

                ModifyIsPwdExpire(0).ISPWDEXPIRE = 1
                userEdmx.SaveChanges()
                'strMsg = "รหัสผ่านของท่านหมดอายุในวันที่ " + qryPwdExpDate(0).PWDEXPIREDATE + " กรุณาติดต่อผู้ดูแลของท่าน"
                strMsg = "รหัสผ่านของท่านหมดอายุในวันที่ " + qryPwdExpDate(0).PWDEXPIREDATE + " กรุณาเปลี่ยนรหัสผ่าน"
                blnStatus = False


            ElseIf (intDay > 0 And intDay < qrySystem(0)) Then
                strMsg = "รหัสผ่านของท่านจะหมดอายุในวันที่ " + qryPwdExpDate(0).PWDEXPIREDATE
                blnStatus = True
            Else
                blnStatus = True
            End If

            qryPwdExpDate.Clear()
            qrySystem.Clear()
            qryPwdExpDate = Nothing
            qrySystem = Nothing
        Catch ex As Data.DataException
            blnStatus = False
            strErrExp = ex.Message
            Throw ex
        Catch ex As Exception
            blnStatus = False
            strErrExp = ex.Message
            Throw ex
        End Try
        Return blnStatus
    End Function

    Private Function chkUserExpDate(ByVal strUserName As String) As Boolean
        Dim blnStatus As Boolean
        userEdmx = New UserEntities
        Try

            Dim intDay As Int16 = 0

            Dim qryUserExpDate = (From user In userEdmx.SUSER Where user.USERNAME = strUserName
                                Select user.USEREXPIREDATE).ToList
            Dim qrySystem = (From systemConfig In config.SSYSTEMCONFIG _
                             Where systemConfig.CONFIGCODE.Contains("C05") _
                             Select systemConfig.CONFIGNUM).ToList



            intDay = difDate(Date.Now, qryUserExpDate(0))

            If (intDay <= 0) Then
                'ให้ทำการแก้ไขสถานะ isPwdexpire = 1 แล้วก็
                'แจ้ง msg ว่าเงื้อนไขหมดอายุแจ้ง admin

                Dim ModifyIsUserExpire = (From tbModifyUser In userEdmx.SUSER _
                           Where tbModifyUser.USERNAME = strUserName _
                           ).ToList

                ModifyIsUserExpire(0).ISUSEREXPIRE = 1
                userEdmx.SaveChanges()

                strMsg = "เนื่องจากชื่อผู้ใช้หมดอายุในวันที่ " + qryUserExpDate(0) + " กรุณาติดต่อผู้ดูแลระบบ"
                blnStatus = False
            ElseIf (intDay > 0 And intDay < qrySystem(0)) Then

                strMsg = "เนื่องจากชื่อผู้ใช้จะหมดอายุในวันที่ " + setFormatDate(qryUserExpDate(0)) + " กรุณาติดต่อผู้ดูแลระบบ"
                blnStatus = True
            Else
                blnStatus = True
            End If

            qryUserExpDate.Clear()
            qrySystem.Clear()
            qryUserExpDate = Nothing
            qrySystem = Nothing
        Catch ex As Data.DataException
            blnStatus = False
            strErrExp = ex.Message
            Throw ex
        Catch ex As Exception
            blnStatus = False
            strErrExp = ex.Message
            Throw ex
        End Try
        Return blnStatus
    End Function

    Private Function chkLocknum(ByVal Locknum As String, ByVal strUserName As String) As Boolean
        Dim blnStatus As Boolean
        userEdmx = New UserEntities
        Try

            Dim qrySystem = (From systemConfig In config.SSYSTEMCONFIG Where systemConfig.CONFIGCODE.Contains("C02") _
                               Select systemConfig.CONFIGNUM).ToList


            If qrySystem(0) = Locknum Then
                Dim qryCurrentLockNum = (From countLockNum In userEdmx.SUSER Where countLockNum.USERNAME = strUserName).ToList
                If (qryCurrentLockNum(0).ISPWDLOCK = 1) Then

                    strMsg = " ล๊อกอิน เกินที่กำหนดไว้ กรุณาติดต่อ ผู้ดูแลระบบ เพื่อปลดล๊อก"
                    blnStatus = False
                ElseIf (qryCurrentLockNum(0).ISPWDLOCK = 0) Then
                    qryCurrentLockNum(0).ISPWDLOCK = 1
                    qryCurrentLockNum(0).PWDLOCKDATE = setFormatDate()
                    userEdmx.SaveChanges()

                    qryCurrentLockNum.Clear()
                    qryCurrentLockNum = Nothing

                    strMsg = " ล๊อกอิน เกินที่กำหนดไว้ กรุณาติดต่อ ผู้ดูแลระบบ เพื่อปลดล๊อก"
                    blnStatus = False
                End If


            Else
                blnStatus = True
            End If


            qrySystem.Clear()
            qrySystem = Nothing

        Catch ex As Data.DataException
            blnStatus = False
            strErrExp = ex.Message
            Throw ex
        Catch ex As Exception
            blnStatus = False
            strErrExp = ex.Message
            Throw ex
        End Try
        Return blnStatus

    End Function

    'Private Function chkPwdLock(ByVal strUserName As String) As Boolean

    'End Function

    Public Function setFormatDate(ByVal strDate As String) As String
        Dim strDateReturn As String = ""
        Dim DateToFormat As Date = Nothing
        Try
            DateToFormat = strDate
            strDateReturn = DateToFormat.ToString("dd/MM/yyyy", New System.Globalization.CultureInfo("th-TH"))
        Catch ex As Exception
            strErrExp = ex.Message
        End Try
        Return strDateReturn

    End Function

    Public Function setFormatDate() As String
        Dim strDateReturn As String = ""

        Try
            strDateReturn = DateTime.Now.ToString("dd/MM/yyyy", New System.Globalization.CultureInfo("th-TH"))
        Catch ex As Exception
            strErrExp = ex.Message
        End Try
        Return strDateReturn
    End Function

    Private Function ComparePassAdmin(ByVal strPass As String) As Boolean
        Dim blnPass As Boolean = False
        Dim clscovertbase As New clsConvertBase

        Try
            Dim strDateTime As String = Format(Date.Now, "DDMMYYYYHH")
            If IsNumeric(strDateTime) Then
                If (clscovertbase.DenaryToBaseX(Convert.ToDouble(strDateTime), 16) = clscovertbase.convert16To10(strPass)) Then
                    blnPass = True

                Else
                    blnPass = False
                End If
            Else
                blnPass = False
            End If
        Catch ex As Exception
            blnPass = False
            strErrExp = ex.Message
        End Try


        Return blnPass
    End Function
#End Region

    'Public Function chkUserRight(ByVal clsMenuRight As clsSessionMenuRight) As List(Of SMENURIGHT)
    '    Try
    '        'Dim qryMenuRight = From UserRight In userEdmx.SUSERRIGHT Join MenuRight In userEdmx.SMENURIGHT _
    '        '               On UserRight.USERRIGHT Equals MenuRight.USERRIGHT _
    '        '               Where UserRight.USERRIGHT = clsMenuRight.getUserRight _
    '        '               Select userRight = MenuRight.USERRIGHT, MenuRight.PROGRAMCODE, _
    '        '                        MenuRight.MQUERY, MenuRight.MADD, _
    '        '                        MenuRight.MMODIFY, MenuRight.MDELETE, MenuRight.MPRINT
    '        'chkUserRight = qryMenuRight
    '        '  If(qryMenuRight.Count=)
    '        chkUserRight = Nothing
    '    Catch ex As Exception
    '        Throw New Exception(aaa())
    '    End Try

    '    chkUserRight = Nothing


    '    Return chkUserRight
    'End Function


    Public Function saveChangePassword(ByVal uName As String, ByVal pwdOld As String, ByVal pwdNew As String) As Boolean
        'บันทึกการเปลี่ยนแปลงรหัสผ่าน
        Dim chkPass As Boolean = False
        Dim pwdHistoryEntity As PwdHistoryEntities
        Dim tblpwdHistory As New SPWDHISTORY
        Dim pwdConvert As String = ""
        Dim clsDateFormat As New clsDateFormat
        userEdmx = New UserEntities
        Try
            Dim userQuery = (From userQ In userEdmx.SUSER _
                        Where userQ.USERNAME = uName _
                        Select userQ.USERNAME, userQ.PASSWORD, userQ.ROLECODE).ToList 'เป็นการคิวรี userName ที่ต้องการ


            If (checkPasswordLogin(userQuery(0).PASSWORD, pwdOld)) Then ' เช็คว่ารหัสเก่า ที่คิวรีมาถูกต้องไหม

                pwdHistoryEntity = New PwdHistoryEntities
                Dim qryPwdHistory = From pwdHistory In pwdHistoryEntity.SPWDHISTORY _
                                    Where pwdHistory.USERNAME = uName 'คิวรีข้อมูลมาเพื่อเช็คการเก็บ ประวัติการสร้างและเปลี่ยน pwd


                If (qryPwdHistory.Count < 4) Then ' เช็คว่ามีการเก็บประวัติมากกว่าสีครั้งหรือไม่
                    pwdConvert = converPassLoginToDB(pwdNew)

                    If (qryPwdHistory.Where(Function(fn) fn.USERNAME = uName And _
                                                         fn.PASSWORD = pwdConvert).Count) = 0 Then 'เป็นการเช็คว่า username และ password มีซ้ำใน history หรือไม่
                        tblpwdHistory.USERNAME = uName
                        tblpwdHistory.PASSWORD = pwdConvert
                        tblpwdHistory.CREATEBY = uName
                        tblpwdHistory.CREATEDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, Date.Now) & " " & Date.Now.ToLongTimeString
                        pwdHistoryEntity.AddToSPWDHISTORY(tblpwdHistory)
                        pwdHistoryEntity.SaveChanges()

                        Dim userUpdate = (From user In userEdmx.SUSER _
                           Where user.USERNAME = uName).First()
                        userUpdate.PASSWORD = pwdConvert 'รหัสผ่านใหม่
                        userUpdate.PWDBEGINDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, Date.Now)
                        userUpdate.PWDEXPIREDATE = clsDateFormat.AutoDate(Global.clsDateFormat.enmAutoDefaultDate.pwdExpire, Global.clsDateFormat.enmDateCultureInfo.En, userQuery(0).ROLECODE)

                        userUpdate.ISPWDEXPIRE = 0
                        userUpdate.MUSTCHANGEPWD = 0
                        userUpdate.UPDATEBY = uName
                        userUpdate.UPDATEDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, dteDateIsChk:=Date.Now)

                        userEdmx.SaveChanges()
                        chkPass = True
                    Else
                        strMsg = "รหัสนี้ไม่สามารถใช้งานได้เนื่องจากได้มีการใช้งานไปแล้ว"
                        chkPass = False
                    End If
                    pwdHistoryEntity = Nothing

                Else
                    Dim dateMin As String
                    dateMin = qryPwdHistory.Min(Function(f) f.CREATEDATE)
                    pwdConvert = converPassLoginToDB(pwdNew)

                    If (qryPwdHistory.Where(Function(fn) fn.USERNAME = uName And fn.PASSWORD = pwdConvert And Not fn.CREATEDATE = dateMin).Count) = 0 Then 'เป็นการเช็คว่า username และ password มีซ้ำใน history หรือไม่

                        Dim whereMin = qryPwdHistory.Where(Function(f) f.CREATEDATE = dateMin).ToList
                        Dim a As String = whereMin(0).USERNAME
                        Dim b As String = whereMin(0).PASSWORD
                        Dim DeleteHistory = (From history In pwdHistoryEntity.SPWDHISTORY _
                                             Where history.USERNAME = a And _
                                                   history.PASSWORD = b).ToList

                        pwdHistoryEntity.DeleteObject(DeleteHistory(0))
                        tblpwdHistory.USERNAME = uName
                        tblpwdHistory.PASSWORD = pwdConvert
                        tblpwdHistory.CREATEBY = uName
                        tblpwdHistory.CREATEDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, Date.Now) & " " & Date.Now.ToLongTimeString
                        pwdHistoryEntity.AddToSPWDHISTORY(tblpwdHistory)
                        pwdHistoryEntity.SaveChanges()

                        Dim userUpdate = (From user In userEdmx.SUSER _
                          Where user.USERNAME = uName).First()

                        userUpdate.PASSWORD = pwdConvert 'รหัสผ่านใหม่
                        userUpdate.PWDBEGINDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, Date.Now)
                        userUpdate.PWDEXPIREDATE = clsDateFormat.AutoDate(Global.clsDateFormat.enmAutoDefaultDate.pwdExpire, Global.clsDateFormat.enmDateCultureInfo.En, userQuery(0).ROLECODE)
                        userUpdate.ISPWDEXPIRE = 0
                        userUpdate.UPDATEBY = uName
                        userUpdate.MUSTCHANGEPWD = 0
                        userUpdate.UPDATEDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, dteDateIsChk:=Date.Now)

                        userEdmx.SaveChanges()
                        chkPass = True

                    Else
                        strMsg = "รหัสนี้ไม่สามารถใช้งานได้เนื่องจากได้มีการใช้งานไปแล้ว"
                        chkPass = False

                    End If
                End If

            Else
                strMsg = " รหัสผู้ใช้เก่าไม่ถูกต้องกรุณาพิมพ์ใหม่อีกครั้ง "
            End If
        Catch ex As Exception
            chkPass = False
            strErrExp = ex.Message
        End Try
        Return chkPass
    End Function

    Public Function SavePwdHistory(ByVal strUserName As String, ByVal strPassword As String, ByVal strCreateBy As String) As Boolean

        Dim pwdHistoryEntity As New PwdHistoryEntities
        Dim tblpwdHistory As New SPWDHISTORY
        Dim clsDateFormat As New clsDateFormat
        Dim dateMin As String
        Dim blnChk As Boolean = False
        Try

            Dim qryPwdHistory = From pwdHistory In pwdHistoryEntity.SPWDHISTORY _
                                       Where pwdHistory.USERNAME = strUserName   'คิวรีข้อมูลมาเพื่อเช็คการเก็บ ประวัติการสร้างและเปลี่ยน pwd

            If Not (qryPwdHistory.Count < 4) Then

                dateMin = qryPwdHistory.Min(Function(f) f.CREATEDATE)

                Dim whereMin = qryPwdHistory.Where(Function(f) f.CREATEDATE = dateMin).ToList
                Dim a As String = whereMin(0).USERNAME
                Dim b As String = whereMin(0).PASSWORD
                Dim DeleteHistory = (From history In pwdHistoryEntity.SPWDHISTORY _
                                     Where history.USERNAME = a And _
                                           history.PASSWORD = b).ToList
                pwdHistoryEntity.DeleteObject(DeleteHistory(0))
                tblpwdHistory.USERNAME = strUserName
                tblpwdHistory.PASSWORD = strPassword
                tblpwdHistory.CREATEBY = strCreateBy
                tblpwdHistory.CREATEDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, Date.Now) & " " & Date.Now.ToLongTimeString
                pwdHistoryEntity.AddToSPWDHISTORY(tblpwdHistory)
                pwdHistoryEntity.SaveChanges()
            Else
                tblpwdHistory.USERNAME = strUserName
                tblpwdHistory.PASSWORD = strPassword
                tblpwdHistory.CREATEBY = strCreateBy
                tblpwdHistory.CREATEDATE = clsDateFormat.chkDateThOrEn(clsDateFormat.enmDateCultureInfo.En, Date.Now) & " " & Date.Now.ToLongTimeString
                pwdHistoryEntity.AddToSPWDHISTORY(tblpwdHistory)
                pwdHistoryEntity.SaveChanges()
            End If
            blnChk = True
        Catch ex As Exception
            blnChk = False

        End Try



        Return blnChk
    End Function

    Public Function chkPwdHistory(ByVal sUser As String, ByVal sPwd As String) As Boolean
        Dim chkPass As Boolean = False
        Dim pwdHistoryEntity As PwdHistoryEntities
        pwdHistoryEntity = New PwdHistoryEntities
        Dim pwdConvert As String = ""

        Try
            Dim qryPwdHistory = From pwdHistory In pwdHistoryEntity.SPWDHISTORY _
                                        Where pwdHistory.USERNAME = sUser 'คิวรีข้อมูลมาเพื่อเช็คการเก็บ ประวัติการสร้างและเปลี่ยน pwd


            If (qryPwdHistory.Count < 4) Then ' เช็คว่ามีการเก็บประวัติมากกว่าสีครั้งหรือไม่
                pwdConvert = converPassLoginToDB(sPwd)
                If (qryPwdHistory.Where(Function(fn) fn.USERNAME = sUser And _
                                                     fn.PASSWORD = pwdConvert).Count) = 0 Then 'เป็นการเช็คว่า username และ password มีซ้ำใน history หรือไม่
                    chkPass = True
                Else
                    strMsg = "รหัสนี้ไม่สามารถใช้งานได้เนื่องจากได้มีการใช้งานไปแล้ว"
                    chkPass = False
                End If
                pwdHistoryEntity = Nothing

            Else
                Dim dateMin As String
                dateMin = qryPwdHistory.Min(Function(f) f.CREATEDATE)
                pwdConvert = converPassLoginToDB(sPwd)

                If (qryPwdHistory.Where(Function(fn) fn.USERNAME = sUser And _
                                            fn.PASSWORD = pwdConvert And Not fn.CREATEDATE = dateMin).Count) = 0 Then 'เป็นการเช็คว่า username และ password มีซ้ำใน history หรือไม่
                    chkPass = True

                Else
                    strMsg = "รหัสนี้ไม่สามารถใช้งานได้เนื่องจากได้มีการใช้งานไปแล้ว"
                    chkPass = False

                End If
            End If
        Catch ex As Exception
            chkPass = False
            strErrExp = ex.Message
        End Try
        Return chkPass
    End Function





End Class
